package br.com.fatecmococa.controller;

import br.com.fatecmococa.dao.ClienteDAO;
import br.com.fatecmococa.dao.DAO;
import br.com.fatecmococa.dao.TransferenciaDAO;
import br.com.fatecmococa.model.Cliente;
import br.com.fatecmococa.model.Transferencia;
import java.util.Date;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;

@ManagedBean(name="transferenciaMB")
@RequestScoped
public class TransferenciaMB implements java.io.Serializable {

    private Double valor;
    private Integer nContaDestino;
    private String nomeCliente;
    
    public TransferenciaMB(){
    }
 
    public void salvar() {
       
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        String userName = authentication.getName();        
        
        DAO.close();
        ClienteDAO clienteDao = new ClienteDAO();        
        
        Cliente clienteOrigem = clienteDao.getClientePorNome(userName);
        Cliente clienteDestino = clienteDao.getClientePorConta(nContaDestino);
        
        if(clienteOrigem.equals(clienteDestino)) {
           FacesMessage  msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Welcome", "Não é possível transferir para a própria conta.");  
           FacesContext.getCurrentInstance().addMessage("mensagemNovo", msg); 
           nomeCliente = null;
           nContaDestino = null;
           valor = null;
           return;
        }
        
        if(clienteOrigem.getSaldo() < valor) {
           FacesMessage  msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Welcome", "A conta não possui saldo suficiente.");  
           FacesContext.getCurrentInstance().addMessage("mensagemNovo", msg); 
           this.valor = null;
           return;
        }
        
          
        if(valor<0) {
           FacesMessage  msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Welcome", "Não é possível relizar transferencia negativa.");  
           FacesContext.getCurrentInstance().addMessage("mensagemNovo", msg); 
           this.valor = null;
           return;
        }
        
        TransferenciaDAO dao = new TransferenciaDAO();        
        
        Transferencia transferencia = new Transferencia();
        transferencia.setDataHora(new Date());
        transferencia.setClienteDestino(clienteDestino);
        transferencia.setClienteOrigem(clienteOrigem);
        transferencia.setValor(valor);
        dao.salvar(transferencia);
        
        FacesMessage  msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Welcome", "Transferencia realizada com Sucesso.");  
        FacesContext.getCurrentInstance().addMessage("mensagemNovo", msg); 
       
        clienteDestino.setSaldo(clienteDestino.getSaldo() + valor);
        clienteOrigem.setSaldo(clienteOrigem.getSaldo() - valor);
        
        clienteDao.atualizar(clienteOrigem);
        clienteDao.atualizar(clienteDestino);
        
        nomeCliente = null;
        nContaDestino = null;
        valor = null;
    }
        
    public boolean validarNumeroConta() {
         
        ClienteDAO dao = new ClienteDAO();
        
        Cliente cliente = dao.getClientePorConta(nContaDestino);
        if(cliente != null) {
            this.nomeCliente = cliente.getNome();  
            return true;
        } else {            
            this.nomeCliente = null;    
            return false;            
        }     
    }
    
    public void validarNumeroContaFinal() {
        if(validarNumeroConta() == false) {
            FacesMessage  msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Welcome", "Número de Conta Inválido.");  
            FacesContext.getCurrentInstance().addMessage("mensagemNovo", msg);
                    
            this.nContaDestino = null;
        }
    }

    public Double getValor() {
        return valor;
    }

    public Integer getnContaDestino() {
        return nContaDestino;
    }

    public void setValor(Double valor) {
        this.valor = valor;
    }

    public void setnContaDestino(Integer nContaDestino) {
      this.nContaDestino = nContaDestino;      
    }

    public String getNomeCliente() {
        return nomeCliente;
    }

    public void setNomeCliente(String nomeCliente) {
        this.nomeCliente = nomeCliente;
    }
           
}
